function parseWithStack(tokens) {
  const stack = [];
  for (const token of tokens) {
    if (token === "]") {
      const subtree = [];
      while (stack[stack.length - 1] !== "[") {
        subtree.unshift(stack.pop());
      }
      stack.pop(); // 弹出 '['
      stack.push(subtree);
    } else {
      stack.push(token);
    }
  }
  return stack[0];
}

const tokens = ["[", "+", 12, "[", "-", 23, 45, "]", "]"];
const astStack = parseWithStack([...tokens]);
console.log(astStack);


// 栈方法使用一个栈数据结构来辅助解析 token 列表。
// 它通过迭代遍历 token 列表，并根据当前 token 的类型和位置，
// 向栈中压入或弹出数据来构建 AST。
// 具体地，当遇到嵌套结构的起始标记时，
// 会向栈中压入一个子树，直到遇到相应的结束标记，
// 然后弹出子树并将其作为一个整体放回栈中。
